package com.eclipse.e20200122_反射.ketang;

import java.lang.reflect.Method;

public class Test1 {

	public static void main(String[] args) throws Exception {
		Student s = new Student();
		Person p = new Person();
//		s.print();
//		test(s);

		Class clz = Student.class;
		
//		System.out.println(clz.getPackage());
		

//		Method[] methods = clz.getMethods();
//		for (Method method : methods) {
//			System.out.println(method.toString());
//		}
//
//		System.out.println("-----------------------------");
//
//		methods = clz.getDeclaredMethods();
//		for (Method method : methods) {
//			System.out.println(method.toString());
//		}
//
//		System.out.println("-----------------------------");
//		// 只能获取public
		Method method = clz.getMethod("print", String.class);
		//通过invoke调用方法
//		method.invoke(s, "invoke");
//
		Class personClz = clz.getSuperclass();
		
//
		method = personClz.getDeclaredMethod("print");
		method.setAccessible(true);
		method.invoke(p);

//		System.out.println("-----------------------------");
//		printObject(s);
	}

	public static void test(Person p) {
		//打印类名
		System.out.println(p.getClass().getSimpleName());
	}

	/**
	 * 打印对象的属性值
	 * 
	 * @param o
	 */
	public static void printObject(Object o) throws Exception {
		Class clz = o.getClass();

		Method[] methods = clz.getMethods();

		for (Method method : methods) {
			String name = method.getName();
			// System.out.println("方法名：" + 返回的值);
			//以get开头的方法 并且不等于getClass
			if (name.startsWith("get") && !name.equals("getClass")) {
				//从第3个下标开始截取到方法名，获取o对象的get方法的参数
				System.out.println(name.substring(3) + ":" + method.invoke(o));
			}
		}
	}

}
